//package com.jjy.game.engine.mina;
//
//import java.net.InetSocketAddress;
//import java.util.function.Consumer;
//
//import org.apache.mina.core.future.ConnectFuture;
//import org.apache.mina.core.service.IoHandler;
//import org.apache.mina.filter.codec.ProtocolCodecFilter;
//import org.apache.mina.transport.socket.SocketSessionConfig;
//import org.apache.mina.transport.socket.nio.NioSocketConnector;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import com.jjy.game.engine.mina.code.DefaultProtocolCodecFactory;
//import com.jjy.game.engine.mina.code.ProtocolCodecFactoryImpl;
//import com.jjy.game.engine.mina.config.MinaClientConfig;
//import com.jjy.game.engine.server.ClientService;
//
///**
// * 客户端
// *
// * @author JiangZhiYong
// * @date 2017-04-01
// * QQ:359135103
// */
//public final class TcpClient implements Runnable {
//
//    private static final Logger log = LoggerFactory.getLogger(TcpClient.class);
//
//    private NioSocketConnector connector = null;		//TCP连接
//    private MinaClientConfig minaClientConfig;			//客户端配置
//    private final IoHandler clientProtocolHandler;		//消息处理器
//    private final ProtocolCodecFilter codecFilter;		//消息过滤器
//    private int maxConnectCount;						//最大连接数
//    private Consumer<MinaClientConfig> sessionCreateCallBack;
//    private final ClientService service; 	//附属的客户端服务
//    private final ProtocolCodecFactoryImpl factory;		//消息工厂
//   
//
//    public TcpClient(ClientService service, MinaClientConfig minaClientConfig, IoHandler clientProtocolHandler, ProtocolCodecFactoryImpl factory) {
//        this.factory=factory;
//        this.codecFilter = new ProtocolCodecFilter(factory);
//        this.service = service;
//        this.clientProtocolHandler = clientProtocolHandler;
//        init(clientProtocolHandler);
//        setMinaClientConfig(minaClientConfig);
//    }
//
//    /**
//     * 使用默认消息解码工厂
//     * @param service
//     * @param minaClientConfig
//     * @param clientProtocolHandler
//     */
//    public TcpClient(ClientService service, MinaClientConfig minaClientConfig, IoHandler clientProtocolHandler) {
//        this.factory=new DefaultProtocolCodecFactory();
//        codecFilter = new ProtocolCodecFilter(this.factory);
//        this.service = service;
//        this.clientProtocolHandler = clientProtocolHandler;
//        init(clientProtocolHandler);
//        setMinaClientConfig(minaClientConfig);
//    }
//
//    /**
//     * 初始化tcp连接
//     * @param clientProtocolHandler
//     */
//    private void init(IoHandler clientProtocolHandler) {
//        this.connector = new NioSocketConnector();
//        this.connector.getFilterChain().addLast("codec", codecFilter);
//        this.connector.setHandler(clientProtocolHandler);
//        connector.setConnectTimeoutMillis(60000L);
//        connector.setConnectTimeoutCheckInterval(10000);
//    }
//
//    /**
//     * 广播所有连接的消息
//     *
//     * @param obj
//     */
//    public void broadcastMsg(Object obj) {
//        this.connector.broadcast(obj);
//    }
//
//    @Override
//    public void run() {
//        synchronized (this) {
//            connect();
//        }
//    }
//
//    /**
//     * 连接服务器
//     */
//    public void connect() {
//        if (getMinaClientConfig() != null) {
//            log.warn("开始链接其他服务器,共 [" + getMinaClientConfig().getMaxConnectCount() + "] 个");
//            MinaClientConfig.MinaClienConnToConfig connTo = getMinaClientConfig().getConnTo();
//            if (connTo == null) {
//                log.warn("没有连接配置");
//                return;
//            }
//            for (int i = 0; i < getMinaClientConfig().getMaxConnectCount(); i++) {
//                ConnectFuture connect = this.connector.connect(new InetSocketAddress(connTo.getHost(), connTo.getPort()));
//                connect.awaitUninterruptibly(10000L);
//                if (!connect.isConnected()) {
//                    log.warn("失败！连接到服务器：" + connTo.toString());
//                    break;
//                } else {
//                    log.warn("成功！连接到服务器：" + connTo.toString());
//                    if (sessionCreateCallBack != null) {
//                        sessionCreateCallBack.accept(getMinaClientConfig());
//                    }
//                }
//            }
//        } else {
//            log.warn("连接配置为null");
//        }
//    }
//
//    public void stop() {
//        synchronized (this) {
//            try {
//                connector.dispose();
//                log.info("Client is stoped.");
//            } catch (Exception ex) {
//                log.error("", ex);
//            }
//        }
//    }
//
//    /**
//     * 状态监测
//     */
//    public void checkStatus() {
//        if (this.connector.getManagedSessionCount() < maxConnectCount || this.connector.getManagedSessions().size() < maxConnectCount) {
//            connect();
//        }
//    }
//
//    public MinaClientConfig getMinaClientConfig() {
//        return minaClientConfig;
//    }
//
//    /**
//     * 设置连接配置
//     * @param minaClientConfig
//     */
//    public void setMinaClientConfig(MinaClientConfig minaClientConfig) {
//        if (minaClientConfig == null) {
//            return;
//        }
//        this.minaClientConfig = minaClientConfig;
//        SocketSessionConfig sc = this.connector.getSessionConfig();
//        maxConnectCount = minaClientConfig.getMaxConnectCount();
//        sc.setReceiveBufferSize(minaClientConfig.getReceiveBufferSize()); // 524288
//        sc.setSendBufferSize(minaClientConfig.getSendBufferSize()); // 1048576
//        sc.setMaxReadBufferSize(minaClientConfig.getMaxReadSize()); // 1048576
//        this.factory.getDecoder().setMaxReadSize(minaClientConfig.getMaxReadSize());
//        sc.setSoLinger(minaClientConfig.getSoLinger()); // 0
//    }
//
//    public IoHandler getClientProtocolHandler() {
//        return clientProtocolHandler;
//    }
//
//    public Consumer<MinaClientConfig> getSessionCreateCallBack() {
//        return sessionCreateCallBack;
//    }
//
//    public void setSessionCreateCallBack(Consumer<MinaClientConfig> sessionCreateCallBack) {
//        this.sessionCreateCallBack = sessionCreateCallBack;
//    }
//
//    public ClientService getService() {
//        return service;
//    }
//    
//}
